package qc.module.demo.api.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.demo.dto.qzj.*;
import qc.module.demo.service.QzjService;

import java.util.List;

/**
 * QzjController
 *
 * @author QuCheng Tech
 */
@RestController
@RequestMapping("/qzj")
public class QzjController {
    private QzjService service;

    @Autowired
    public void setQzjService(QzjService service) {
        this.service = service;
    }

    @GetMapping("/needhandled")
    //public List<QzjDataDto> getNeedHandledList(@RequestParam Integer count){
    public List<QzjDataDto> getNeedHandledList(@RequestParam(value = "count", required = false) Integer count) {
        return service.getNeedHandledList(count);
    }

    @PostMapping("/rehandle")
    public String reHandle(@RequestBody QzjRehandleDto dto) {
        return service.reHandle(dto);
    }

    @PostMapping("/save")
    public String addNewData(@RequestBody QzjNewDataDto dto) {
        return service.Save(dto);
    }

    @PostMapping("/query")
    public List<QzjDataDto> query(@RequestBody QzjQueryConditionDto dto) throws Exception {
        return service.query(dto);
    }

    @PostMapping("/batch")
    public String batchSaveData(@RequestBody List<QzjNewDataDto> list) {
        return service.batchSaveData(list);
    }

    @PostMapping("/setflag")
    public String setFlagById(@RequestBody QzjUpdateFlagDto dto) {
        return service.setFlag(dto);
    }

    /*
     * 以下为测试方法，与实际业务无关，仅为测试功能或使用方法
     */

    //测试在api中抛出自定义异常，在gateway中捕获处理
    @GetMapping("/test")
    public String test(@RequestParam(value = "id", required = false) String id) throws Exception {
        if (StringUtils.isBlank(id))
            //throw new QCPromptException("传入的参数id不能为空");
            return QCUnifyReturnValue.Warn("test——传入的参数id不能为空");

        if (id.equals("ex"))
            throw new Exception("test——测试api中抛出异常");
        if (id.equals("exx"))
            throw new QCPromptException("test——测试api中抛出异常");

        return QCUnifyReturnValue.Success();
    }

    //注意：上面的方法和下面的方法映射的地址相同，在地址后带参数时路由会进下面的方法，地址后不带参数时路由会进上面的方法
    //可以通过路由表示默认操作或指定操作，如：/qzj/表示查询，/qzj/{id}表示获取指定id的记录

    //测试通过URL传参，不是在地址后加问号方式
    @GetMapping("/test/{id}")
    public String testPathVariable(@PathVariable(required = true) String id) throws Exception {
        if (StringUtils.isBlank(id))//如果不带id参数进不到该方法，实测为404错误
            return QCUnifyReturnValue.Warn("testPathVariable——传入的参数id不能为空");
        //throw new QCPromptException("传入的参数id不能为空");

        if (id.equals("ex"))
            throw new Exception("testPathVariable——测试api中抛出异常");
        if (id.equals("exx"))
            throw new QCPromptException("testPathVariable——测试api中抛出异常");

        return QCUnifyReturnValue.Success("testPathVariable——传入的参数id为：" + id);
    }

    //测试路由，测试映射地址仅为斜线
    @GetMapping("/")
    public String testRoute(@RequestParam(value = "id", required = false) String id) throws Exception {
        if (StringUtils.isBlank(id))
            //throw new QCPromptException("传入的参数id不能为空");
            return QCUnifyReturnValue.Warn("testRoute——传入的参数id不能为空");

        if (id.equals("ex"))
            throw new Exception("testRoute——测试api中抛出异常");
        if (id.equals("exx"))
            throw new QCPromptException("testRoute——测试api中抛出异常");

        return QCUnifyReturnValue.Success("testRoute——传入的参数id为：" + id);
    }

    //测试使用get请求方式时通过body传参，实测正常
    @GetMapping("/testbody")
    public List<QzjDataDto> testGetBodyParams(@RequestBody QzjQueryConditionDto dto) throws Exception {
        return service.query(dto);
    }

    //测试mybatis-plus查询部分字段
    @GetMapping("/testfields")
    public List<QzjDataDto> testQueryFields(@RequestBody QzjQueryConditionDto dto) throws Exception {
        return service.queryPartFields(dto);
    }

    @GetMapping("/timeout")
    public String testTimeout(@RequestParam(value = "id", required = false) int id) throws InterruptedException {
        if (id > 0x0) {
            //模拟延迟，测试超时时间
            Thread.sleep(id * 1000);
        }

        return QCUnifyReturnValue.Success();
    }
}
